package rpc.common.utils;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;

/**
 * 钩子: 是在某些事件发生后自动去调用的方法。
 * 把注销服务的方法写到关闭系统的钩子方法里
 */
@Slf4j
public class ShutdownHook {

    private final ExecutorService threadPool = ThreadPoolFactory.createDefaultThreadPool("shutdownHook");
    private static final ShutdownHook shutdownHook = new ShutdownHook();

    public static ShutdownHook getShutdownHook() {
        return shutdownHook;
    }

    /**
     * 服务器关闭后，注销该服务器在，注册中心的注册的所有服务
     */
    public void addClearAllHook() {
        log.debug("当前服务器关闭后，将自动注销注册中心对应的所有服务");
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            log.debug("在注册中心，注销该服务器所有服务");
            NacosUtil.clearRegistry();
            threadPool.shutdown();
        }));
    }


}
